// ts 高级用法
// class类
class person {
    age: number;
    gender = '男'

    constructor(age: number, gender: string) {
        this.age = age
        this.gender = gender
    }
}

class point {
    x = 10;
    y = 20;
    scale(n: number): void {
        this.x *= n
        this.y *= n
    }
}

// 继承
class Animal {
    move() { console.log('移动!') }
}
class Dog extends Animal {
    bark() { console.log('汪') }
}
const dog = new Dog()
dog.move()

// 接口实现继承
// 1 public（公有的） 2 protected（受保护的） 3 private（私有的）
// 1. public：表示公有的、公开的，公有成员可以被任何地方访问，默认可见性。
// 2. protected：表示受保护的，仅对其声明所在类和子类中（非实例对象）可见。
// 3. private：表示私有的，只在当前类中可见，对实例对象以及子类也是不可见的。
// readonly：表示只读，用来防止在构造函数之外对属性进行赋值。
interface Singable {
    sing(): void
}
class Person implements Singable {
    public sing() {
        console.log('唱歌')
    }
}


// 类型兼容性
class Point1 { x: number; y: number }
class Point2 { x: number; y: number }
class Point3 { x: number; y: number; z: number }
const p1: Point1 = new Point2()
const p2: Point1 = new Point3()
// 成员多的Point3可以复制给成员少的Point

// 接口
interface Point4 { x: number; y: number }
interface Point5 { x: number; y: number }
interface Point6 { x: number; y: number; z: number }
let p3: Point4
let p4: Point5 = p3
let p5: Point6
p4 = p5

type F1 = (a: number) => string
type F2 = (a: number) => string
let f1: F1
let f2: F2 = f1